﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FlorDeLiz.BusinessEntitites;
using System.Data;
using MySql.Data.MySqlClient;
using Constants = FlorDeLiz.Utils.Constants;

namespace FlorDeLiz.DataAccess
{
    public class ClienteDA : BaseDA
    {
        #region Singleton
        private static ClienteDA instancia;
        public static ClienteDA Instancia
        {
            get
            {
                if (instancia == null)
                {
                    instancia = new ClienteDA();
                }
                return instancia;
            }
        }
        #endregion        

        public List<Cliente> ObterClientes(int? id, string nome, string cpf_Cnpj)
        {
            List<Cliente> clientes = new List<Cliente>();
            try
            {
                if (Conexao.State != ConnectionState.Open)
                {
                    Conexao.Open();
                }
                CommandSql = new MySqlCommand(Constants.Procedures.SP_SELECT_CLIENTE, Conexao);

                if (id.HasValue)
                {
                    CommandSql.Parameters.Add(AdicionarParametro("P_ID_CLIENTE", MySqlDbType.Int32, 11, ParameterDirection.Input, id.Value));
                }
                else
                {
                    CommandSql.Parameters.Add(AdicionarParametro("P_ID_CLIENTE", MySqlDbType.Int32, 11, ParameterDirection.Input, DBNull.Value));
                }

                if (!string.IsNullOrEmpty(nome))
                {
                    CommandSql.Parameters.Add(AdicionarParametro("P_NM_CLIENTE", MySqlDbType.String, 80, ParameterDirection.Input, nome));
                }
                else
                {
                    CommandSql.Parameters.Add(AdicionarParametro("P_NM_CLIENTE", MySqlDbType.String, 80, ParameterDirection.Input, DBNull.Value));
                }

                if (!string.IsNullOrEmpty(cpf_Cnpj))
                {
                    CommandSql.Parameters.Add(AdicionarParametro("P_CPF_CNPJ_CLIENTE", MySqlDbType.String, 14, ParameterDirection.Input, cpf_Cnpj));
                }
                else
                {
                    CommandSql.Parameters.Add(AdicionarParametro("P_CPF_CNPJ_CLIENTE", MySqlDbType.String, 14, ParameterDirection.Input, DBNull.Value));
                }

                CommandSql.CommandType = System.Data.CommandType.StoredProcedure;
                using (MySqlDataReader reader = CommandSql.ExecuteReader())
                {
                    clientes = PreencherClientes( reader);
                }
            }
            catch (Exception ex)
            {
                if (Conexao.State == ConnectionState.Open)
                {
                    Conexao.Close();
                }
                throw ex;
            }
            finally
            {
                if (Conexao.State == ConnectionState.Open)
                {
                    Conexao.Close();
                }
            }
            return clientes;
        }
        
        public Cliente InserirCliente(Cliente cliente)
        {
            try
            {
                if (Conexao.State != ConnectionState.Open)
                {
                    Conexao.Open();
                }

                CommandSql = new MySqlCommand(Constants.Procedures.SP_INSERT_CLIENTE, Conexao);

                CommandSql.Parameters.Add(AdicionarParametro("P_NM_CLIENTE", MySqlDbType.String, 80, ParameterDirection.Input, cliente.Nome));
                CommandSql.Parameters.Add(AdicionarParametro("P_CPF_CNPJ_CLIENTE", MySqlDbType.String, 14, ParameterDirection.Input, cliente.CPF_CNPJ));
                CommandSql.Parameters.Add(AdicionarParametro("P_DT_NASCIMENTO", MySqlDbType.DateTime, 0, ParameterDirection.Input, cliente.DataNascimento));
                CommandSql.Parameters.Add(AdicionarParametro("P_EMAIL_CLIENTE", MySqlDbType.String, 100, ParameterDirection.Input, cliente.Email));
                CommandSql.Parameters.Add(AdicionarParametro("P_TEL_RESIDENCIAL", MySqlDbType.String, 10, ParameterDirection.Input, cliente.TelResidencial));
                CommandSql.Parameters.Add(AdicionarParametro("P_TEL_CELULAR", MySqlDbType.String, 10, ParameterDirection.Input, cliente.TelCelular));
                CommandSql.Parameters.Add(AdicionarParametro("P_ENDERECO", MySqlDbType.String, 100, ParameterDirection.Input, cliente.Endereco));
                CommandSql.Parameters.Add(AdicionarParametro("P_NUMERO", MySqlDbType.String, 5, ParameterDirection.Input, cliente.Numero));
                CommandSql.Parameters.Add(AdicionarParametro("P_BAIRRO", MySqlDbType.String, 30, ParameterDirection.Input, cliente.Bairro));
                CommandSql.Parameters.Add(AdicionarParametro("P_CIDADE", MySqlDbType.String, 50, ParameterDirection.Input, cliente.Cidade));
                CommandSql.Parameters.Add(AdicionarParametro("P_ESTADO", MySqlDbType.String, 2, ParameterDirection.Input, cliente.Estado));

                CommandSql.CommandType = CommandType.StoredProcedure;
                using (MySqlDataReader reader = CommandSql.ExecuteReader())
                {
                    List<Cliente> clientes = PreencherClientes(reader);
                    if (clientes != null && clientes.Count > 0)
                    {
                        cliente = clientes[0];
                    }
                }
            }
            catch (Exception ex)
            {
                if (Conexao.State == ConnectionState.Open)
                {
                    Conexao.Close();
                }
                throw ex;
            }
            finally
            {
                if (Conexao.State == ConnectionState.Open)
                {
                    Conexao.Close();
                }
            }

            return cliente;
        }

        public Cliente AlterarCliente(Cliente cliente)
        {
            try
            {
                if (Conexao.State != ConnectionState.Open)
                {
                    Conexao.Open();
                }

                CommandSql = new MySqlCommand(Constants.Procedures.SP_UPDATE_CLIENTE, Conexao);

                CommandSql.Parameters.Add(AdicionarParametro("P_ID_CLIENTE", MySqlDbType.Int32, 4, ParameterDirection.Input, cliente.Id));               
                CommandSql.Parameters.Add(AdicionarParametro("P_NM_CLIENTE", MySqlDbType.String, 80, ParameterDirection.Input, cliente.Nome));
                CommandSql.Parameters.Add(AdicionarParametro("P_CPF_CNPJ_CLIENTE", MySqlDbType.String, 14, ParameterDirection.Input, cliente.CPF_CNPJ));
                CommandSql.Parameters.Add(AdicionarParametro("P_DT_NASCIMENTO", MySqlDbType.DateTime, 0, ParameterDirection.Input, cliente.DataNascimento));
                CommandSql.Parameters.Add(AdicionarParametro("P_EMAIL_CLIENTE", MySqlDbType.String, 100, ParameterDirection.Input, cliente.Email));
                CommandSql.Parameters.Add(AdicionarParametro("P_TEL_RESIDENCIAL", MySqlDbType.String, 10, ParameterDirection.Input, cliente.TelResidencial));
                CommandSql.Parameters.Add(AdicionarParametro("P_TEL_CELULAR", MySqlDbType.String, 10, ParameterDirection.Input, cliente.TelCelular));
                CommandSql.Parameters.Add(AdicionarParametro("P_ENDERECO", MySqlDbType.String, 100, ParameterDirection.Input, cliente.Endereco));
                CommandSql.Parameters.Add(AdicionarParametro("P_NUMERO", MySqlDbType.String, 5, ParameterDirection.Input, cliente.Numero));
                CommandSql.Parameters.Add(AdicionarParametro("P_BAIRRO", MySqlDbType.String, 30, ParameterDirection.Input, cliente.Bairro));
                CommandSql.Parameters.Add(AdicionarParametro("P_CIDADE", MySqlDbType.String, 50, ParameterDirection.Input, cliente.Cidade));
                CommandSql.Parameters.Add(AdicionarParametro("P_ESTADO", MySqlDbType.String, 2, ParameterDirection.Input, cliente.Estado));

                CommandSql.CommandType = CommandType.StoredProcedure;

                CommandSql.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                if (Conexao.State == ConnectionState.Open)
                {
                    Conexao.Close();
                }
                throw ex;
            }
            finally
            {
                if (Conexao.State == ConnectionState.Open)
                {
                    Conexao.Close();
                }
            }

            return cliente;
        }


        private static List<Cliente> PreencherClientes(MySqlDataReader reader)
        {
            List<Cliente> clientes = new List<Cliente>();
            Cliente cliente;
            while (reader.Read())
            {
                cliente = new Cliente();
                cliente.Id = (int)reader["ID_CLIENTE"];
                cliente.Nome = reader["NM_CLIENTE"].ToString();
                cliente.CPF_CNPJ = reader["CPF_CNPJ_CLIENTE"].ToString();
                cliente.DataNascimento = (DateTime)reader["DT_NASCIMENTO"];
                cliente.TelResidencial = reader["TEL_RESIDENCIAL"].ToString();
                cliente.Endereco = reader["ENDERECO"].ToString();
                cliente.Numero = reader["NUMERO"].ToString();
                cliente.Bairro = reader["BAIRRO"].ToString();
                cliente.Cidade = reader["CIDADE"].ToString();
                cliente.Estado = reader["ESTADO"].ToString();

                cliente.TelCelular = reader["TEL_CELULAR"] == DBNull.Value ? string.Empty : reader["TEL_CELULAR"].ToString();
                cliente.Email = reader["EMAIL_CLIENTE"] == DBNull.Value ? string.Empty : reader["EMAIL_CLIENTE"].ToString();

                clientes.Add(cliente);
            }

            return clientes;
        }       
    }
}
